package com.probiz.estore.catalog.dao;

import com.probiz.estore.core.dao.GenericDao;
import com.probiz.estore.catalog.model.BaseCategory;
import com.probiz.estore.catalog.model.BaseCategorySearchCriteria;

/**
 * Created by Probiz
 * User: hoverming
 * Date: 2009-12-2
 * Time: 11:01:25
 */
public interface BaseCategoryDao<T> extends GenericDao<T> {

	/**
	 * 根据目录id获得Category对象
	 * @param categoryId  目录id
	 * @return categoryId = id 的category对象
	 */
	public BaseCategory getCategoryById(Integer categoryId);

	/**
	 * 获得目录树
	 * 用法：例如getCategoryTree(getCategoryById(2),3),那么将会获得一棵根节点为T(id=2)，包含3代儿子的树(自己不算一层深度);
	 * 再如getCategory(null,4),那么将会获得一棵根节点T(id=1),包含4代儿子的树。
	 * 另外如果depth<=0那么将只包含根节点
	 * @param parentCategory
	 *            父目录   目录树的起始节点
	 * @param depth
	 *            取树的深度(不超过) 注意：这个深度是相对深度。
	 * @return Category 返回树的根节点
	 */
	public BaseCategory getCategoryTree(BaseCategory parentCategory, int depth);

	/**
	 * 获得目录树 
	 * 用法：例如getCategoryTree(getCategoryById(2),3),那么将会获得一棵根节点为T(id=2)，包含3代儿子的树(自己不算一层深度);
	 * 再如getCategory(null,4),那么将会获得一棵根节点T(id=1),包含4代儿子的树。
	 * 另外如果depth<=0那么将只包含根节点
	 * @param parentCategory
	 *            父目录  目录树的起始节点
	 * @param depth
	 *            取树的深度(不超过) 注意：这个深度是相对深度。
	 * @param  categorySearchCriteria 目录搜索条件
	 * @return Category 返回树的根节点
	 */
	public BaseCategory getCategoryTree(BaseCategory parentCategory, int depth, BaseCategorySearchCriteria categorySearchCriteria);

	/**
	 * 统计指定目录下的直接子目录数
	 * @param categoryId 父目录ID
	 * @return 子目录数
	 */
	public Integer countSubCategoryById(Integer categoryId);
	
	/**
	 * 获得平台目录总数
	 * @return
	 */
	public Long countCategoryTotal();
}
